package ejb;

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import interfaces.SolicitarCotizacion;
import interfaces.TagsXML;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;

import entitys.Cliente;
import entitys.Cotizacion;
import entitys.ItemCotizacion;
import entitys.ItemSolicitudCotizacion;
import entitys.Rodamiento;
import entitys.SolicitudCotizacion;


@EJB(name="PedirCotizacionBean", beanInterface=SolicitarCotizacion.class)
@Stateless
public class SolicitarCotizacionBean implements SolicitarCotizacion,TagsXML {

	@PersistenceContext(unitName = "OficinaVentas")
	private EntityManager manager;

	public SolicitarCotizacionBean() {
	}

	@Override
	public String obtenerCotizacion(SolicitudCotizacion oSolCot,Cliente cliente) {
		cliente = manager.find(Cliente.class,cliente.getCuit());
		
		for(ItemSolicitudCotizacion oItem : oSolCot.getItems())
			oItem.setRodamiento(manager.find(Rodamiento.class,oItem.getRodamiento().getIdRodamiento()));

		Cotizacion cotizacion = new Cotizacion();
		cotizacion.setFechaEmision();
		cotizacion.setFechaVencimiento();
		setearItemsCotizacion(cotizacion,oSolCot.getItems());
		oSolCot.setCotizacion(cotizacion);
		cliente.agregarSolicitudCotizacion(oSolCot);
		oSolCot.setCliente(cliente);
		manager.persist(oSolCot);
		manager.flush();
		return getXMLCotizacion(oSolCot.getCotizacion());
	}

	private void setearItemsCotizacion(Cotizacion cotizacion,List<ItemSolicitudCotizacion> itemsSolicitud) {
		List<ItemCotizacion> itemsCotizacion = new ArrayList<ItemCotizacion>();
		double totalCotizacion = 0.0;
		for (ItemSolicitudCotizacion itemSolCot : itemsSolicitud) {
			Document oDoc = obtenerPrecio(getXMLSolicitudPrecio(itemSolCot));
			double precioCompra = Double.valueOf(oDoc.getRootElement().getChild(PRECIO_TOTAL).getTextTrim());
			double precioVenta = (precioCompra + precioCompra * 0.5)/itemSolCot.getCantidad();
			totalCotizacion = totalCotizacion + precioVenta;
			itemsCotizacion.add(new ItemCotizacion(itemSolCot.getCantidad(),precioVenta, itemSolCot.getRodamiento()));
		}
		cotizacion.setItemsCotizacion(itemsCotizacion);
		cotizacion.setPrecioTotal(totalCotizacion);
	}

	private String getXMLSolicitudPrecio(ItemSolicitudCotizacion oItemSolCot) {
		Element root = new Element(SOLICITUD_PRECIO);
		Element idRod = new Element(ID_RODAMIENTO);
		idRod.setText(oItemSolCot.getRodamiento().getIdRodamiento());
		root.addContent(idRod);
		Element cantidad = new Element(CANTIDAD);
		cantidad.setText(String.valueOf(oItemSolCot.getCantidad()));
		root.addContent(cantidad);
		Document oDoc = new Document();
		oDoc.addContent(root);
		XMLOutputter xml = new XMLOutputter();
		return xml.outputString(oDoc);
	}

	/** El XML que recibe es el XML getPrecio, falta llamar al WebService */
	private Document obtenerPrecio(String sXmlGetPrecio) {
		String sXmlDevolucionPrecio = null;
		
		sXmlDevolucionPrecio  = "<?xml version='1.0' encoding='UTF-8'?>"
							  + "<DevolucionPrecio>"
							  + "<IdRodamiento>22310</IdRodamiento>"
							  + "<Cantidad>2</Cantidad>"
							  + "<precioUnitario>10</precioUnitario>"
							  + "<precioTotal>105.5</precioTotal>"
							  + "</DevolucionPrecio>";
		
		Document oDoc = null;
		try {
			SAXBuilder xmlBuilder = new SAXBuilder();
			Reader in = new StringReader(sXmlDevolucionPrecio);
			oDoc = xmlBuilder.build(in);
		} catch (JDOMException je) {
			je.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return oDoc;
	}

	private String getXMLCotizacion(Cotizacion oCotizacion) {
		SimpleDateFormat oFormatoFecha = new SimpleDateFormat("dd/mm/yyyy");

		Element root = new Element(COTIZACION);
		root.setAttribute(NRO_COTIZACION,String.valueOf(oCotizacion.getIdCotizacion()));
		root.setAttribute(FECHA_EMISION,oFormatoFecha.format(oCotizacion.getFechaEmision()));
		root.setAttribute(FECHA_VENCIMIENTO,oFormatoFecha.format(oCotizacion.getFechaEmision()));

		double totalCotizacion = 0.0;
		for (ItemCotizacion oItemCotizacion : oCotizacion.getItemsCotizacion()) {
			Element item = new Element(ITEM_COTIZACION);
			Element idRod = new Element(ID_RODAMIENTO);
			idRod.setText(String.valueOf(oItemCotizacion.getRodamiento().getIdRodamiento()));
			item.addContent(idRod);
			Element cantidad = new Element(CANTIDAD);
			cantidad.setText(String.valueOf(oItemCotizacion.getCantidad()));
			item.addContent(cantidad);
			Element precioUnitario = new Element(PRECIO_UNITARIO);
			precioUnitario.setText(String.valueOf(oItemCotizacion.getPrecioUnitario()));
			item.addContent(precioUnitario);
			Element precioFinal = new Element(PRECIO_FINAL);
			precioFinal.setText(String.valueOf(oItemCotizacion.getPrecioUnitario() * oItemCotizacion.getCantidad()));
			item.addContent(precioFinal);
			root.addContent(item);
			totalCotizacion = totalCotizacion+ oItemCotizacion.getPrecioUnitario() * oItemCotizacion.getCantidad();
		}
		root.setAttribute(PRECIO_TOTAL, String.valueOf(totalCotizacion));

		Document oDoc = new Document();
		oDoc.addContent(root);
		XMLOutputter xml = new XMLOutputter();
		return xml.outputString(oDoc);
	}
}
